
/* 
    路由级权限控制思路:
        1.准备工作1, 提前编写过滤路由的函数, 
        2.准备工作2, 将固定路由和业务路由分开管理, 将固定路由设置为默认所有用户都可以访问的路由, 给业务路由添加权限标识.
        3.在登陆成功并且保存token及userinfo之后,跳转首页之前 , 调用过滤路由的函数, 过滤出用户有权限访问的业务路由.
        4.将过滤出来的路由 用forEach遍历,并使用 addRoute 动态添加到router中.
        5.正常访问路由.
    
    按钮级权限控制思路:
        1.准备工作1, 提前编写判断按钮权限的函数 
        2.准备工作2, 提前给按钮添加权限标识.
        3.在组件中准备渲染按钮时调用判断按钮权限的函数, 判断用户是否有权限访问该按钮, 如果有权限则渲染出该按钮, 否则不渲染.
        4.正常访问按钮.
*/

function hasAuth( permission, permissions ){
    //判断是否有访问该路由的权限 , 结果是 true/false
    return permissions.includes(permission);
}


/* 
    功能: 拿到一个路由, 用户的权限列表, 判断这个路由是否在用户的权限列表中, 返回ture/false
    返回值: true 表示用户有访问该路由的权限, false表示用户没有访问该路由的权限
    参数一: route 路由 , 例如: {path: '',meta:{permission:2},component: Register}
    参数二: permissions 用户的权限列表 , 例如:  [1, 11, 2]
*/
function hasPermission( route, permissions ){
    //需要权限才能访问
    if( route.meta && route.meta.permission ){
        //判断是否有访问该路由的权限 , 结果是 true/false
        return permissions.includes(route.meta.permission);
    //不需要权限就可以访问    
    }else{ 
        return true;
    }
}

/* 
    功能: 拿到业务路由表,用户的权限列表, 根据用户的权限列表从业务路由表中过滤出用户有权限访问的路由.
    参数一: routes 业务路由表 , 例如: [{path: '',meta:{permission:2},component: Register},...]
    参数二: permissions 用户的权限列表 , 例如:  [1, 11, 2]
*/
export function filterRoutes( routes, permissions ){
    var accessRoutes = [];
    //过滤routes这个路由表
    accessRoutes = routes.filter((route)=>{
        //判断: 如果route表示的路由规则在用户的权限列表中,则用户有权限访问该路由,该路由就需要过滤出来.
        if( hasPermission( route, permissions ) ){
            //如果route 这个路由有子路由表, 则继续过滤子路由表
            if( route.children && route.children.length ){
                //继续过滤子路由表( 调用 filterRoutes 自身 过滤子路由表 )
                route.children = filterRoutes( route.children, permissions )
            }
            return true;
        }else{
            return false;
        }
    })

    //返回最终过滤出来的 用户有权限访问的路由.
    return accessRoutes;
}
